const express = require('express');
const router = express.Router();
const WechatOfficialService = require('../utils/WechatOfficialService');
const response = require('../utils/response');
const { prisma } = require('../config/prisma');
const UserPrisma = require('../models/UserPrisma');

/**
 * 微信公众号服务器配置验证
 * GET /api/v1/wechat-official/callback
 */
router.get('/callback', (req, res) => {
  try {
    const { signature, timestamp, nonce, echostr } = req.query;

    console.log('收到微信服务器验证请求:', {
      signature,
      timestamp,
      nonce,
      echostr
    });

    // 验证必要参数
    if (!signature || !timestamp || !nonce || !echostr) {
      console.error('微信验证参数不完整');
      return res.status(400).send('参数不完整');
    }

    // 验证签名
    const isValid = WechatOfficialService.verifySignature(signature, timestamp, nonce);

    if (isValid) {
      console.log('微信服务器验证成功，返回echostr:', echostr);
      res.send(echostr);
    } else {
      console.error('微信服务器验证失败');
      res.status(403).send('验证失败');
    }
  } catch (error) {
    console.error('微信服务器验证异常:', error);
    res.status(500).send('服务器错误');
  }
});

/**
 * 处理微信公众号推送的事件和消息
 * POST /api/v1/wechat-official/callback
 */
router.post('/callback', express.raw({ type: 'text/xml' }), async (req, res) => {
  try {
    console.log('收到微信推送消息');

    const xml = req.body.toString();
    console.log('推送内容:', xml);

    // 简单的XML解析（实际项目中建议使用xml2js库）
    const data = parseSimpleXML(xml);
    console.log('解析后的数据:', data);

    // 处理不同类型的消息
    let replyContent = '';

    if (data.MsgType === 'event') {
      // 处理事件消息
      replyContent = await handleEventMessage(data);
    } else if (data.MsgType === 'text') {
      // 处理文本消息
      replyContent = await handleTextMessage(data);
    }

    // 返回响应（如果有回复内容）
    if (replyContent) {
      const replyXML = createReplyXML(data.FromUserName, data.ToUserName, replyContent);
      res.set('Content-Type', 'application/xml');
      res.send(replyXML);
    } else {
      res.send('success');
    }

  } catch (error) {
    console.error('处理微信推送失败:', error);
    res.send('success'); // 即使出错也要返回success，避免微信重复推送
  }
});

/**
 * 测试接口 - 发送模板消息
 * POST /api/v1/wechat-official/test-send
 */
router.post('/test-send', async (req, res) => {
  try {
    const { openid } = req.body;

    if (!openid) {
      return response.error(res, 'openid不能为空');
    }

    // 测试数据
    const testListing = {
      region: '江苏',
      category: '装修',
      title: '测试挂牌信息',
      contact_person: '测试联系人'
    };

    const result = await WechatOfficialService.sendListingAlert(openid, testListing);

    if (result.success) {
      return response.success(res, result, '测试消息发送成功');
    } else {
      return response.error(res, result.error);
    }
  } catch (error) {
    console.error('发送测试消息失败:', error);
    return response.error(res, '发送失败', 500);
  }
});

/**
 * 简单的XML解析函数
 */
function parseSimpleXML(xml) {
  const data = {};
  const regex = /<(\w+)><!\[CDATA\[(.*?)\]\]><\/\1>|<(\w+)>(.*?)<\/\3>/g;
  let match;

  while ((match = regex.exec(xml)) !== null) {
    const key = match[1] || match[3];
    const value = match[2] || match[4];
    data[key] = value;
  }

  return data;
}

/**
 * 处理事件消息
 */
async function handleEventMessage(data) {
  const { Event, FromUserName } = data;

  switch (Event) {
    case 'subscribe':
      // 用户关注事件
      console.log('用户关注公众号:', FromUserName);
      return await handleUserSubscribe(FromUserName);

    case 'unsubscribe':
      // 用户取消关注事件
      console.log('用户取消关注公众号:', FromUserName);
      await handleUserUnsubscribe(FromUserName);
      break;

    default:
      console.log('未处理的事件类型:', Event);
  }

  return '';
}

/**
 * 处理文本消息
 */
async function handleTextMessage(data) {
  const { Content, FromUserName } = data;

  // 处理绑定命令
  if (Content && Content.startsWith('绑定 ')) {
    return await handleBindCommand(FromUserName, Content);
  }

  // 处理关闭通知命令
  if (Content && (Content === '关闭通知' || Content === '关闭推送')) {
    return await handleToggleNotification(FromUserName, false);
  }

  // 处理开启通知命令
  if (Content && (Content === '开启通知' || Content === '开启推送')) {
    return await handleToggleNotification(FromUserName, true);
  }

  // 处理查询绑定状态命令
  if (Content && (Content === '状态' || Content === '绑定状态')) {
    return await handleQueryStatus(FromUserName);
  }

  return '请回复相应指令：\n\n• 绑定 手机号 - 绑定账号\n• 开启通知 - 开启推送\n• 关闭通知 - 关闭推送\n• 状态 - 查询绑定状态\n\n示例：绑定 13812345678';
}

/**
 * 处理用户关注
 */
async function handleUserSubscribe(openid) {
  try {
    const profile = await WechatOfficialService.fetchOfficialUserProfile(openid);
    const unionId = profile?.unionid || null;

    console.log('公众号用户关注，获取到的 unionId:', unionId);

    if (unionId) {
      const user = await UserPrisma.findByUnionId(unionId);

      if (user) {
        await UserPrisma.update(user.id, {
          wechat_official_openid: openid,
          wechat_official_subscribed: true,
          wechat_notification_enabled: true
        });

        await UserPrisma.updateOpenPlatformBindings(user.id, { union_id: unionId });

        console.log('自动绑定公众号成功:', {
          userId: user.id,
          unionId,
          officialOpenid: openid
        });

        return `绑定成功！

您的账号已与微信公众号自动关联，将收到以下提醒：
• 全国群聊新消息推送
• 新挂牌信息推送
• 系统重要通知

如需关闭推送，可随时回复"关闭通知"；重新开启请回复"开启通知"。`;
      }
    }

    console.log('未找到匹配的用户，等待用户登录小程序完成绑定');
    return `欢迎关注！

为了接收消息提醒，请先打开小程序并完成登录，我们会自动完成绑定。
如暂时无法登录，也可以回复“绑定 手机号”手动绑定账号。`;
  } catch (error) {
    console.error('处理用户关注失败:', error);
    return `欢迎关注！

系统当前暂时无法自动完成绑定，请稍后在小程序中登录确认或回复“绑定 手机号”手动绑定。`;
  }
}

/**
 * 处理用户取消关注
 */
async function handleUserUnsubscribe(openid) {
  try {
    // 更新用户关注状态(使用新的字段名)
    await prisma.users.updateMany({
      where: { wechat_official_openid: openid },
      data: { wechat_official_subscribed: false }
    });
    console.log('更新用户取消关注状态:', openid);
  } catch (error) {
    console.error('处理用户取消关注失败:', error);
  }
}

/**
 * 处理绑定命令
 */
async function handleBindCommand(openid, content) {
  try {
    const phoneNumber = content.replace('绑定 ', '').trim();

    // 验证手机号格式
    if (!/^1[3-9]\d{9}$/.test(phoneNumber)) {
      return '手机号格式不正确，请重新输入\n正确格式：绑定 13812345678';
    }

    // 查找用户
    const user = await prisma.users.findFirst({
      where: { phone_number: phoneNumber }
    });

    if (user) {
      // 绑定用户(使用新的字段名)
      await prisma.users.update({
        where: { id: user.id },
        data: {
          wechat_official_openid: openid,
          wechat_official_subscribed: true,
          wechat_notification_enabled: true // 默认开启通知
        }
      });

      console.log('用户绑定成功:', { userId: user.id, openid, phoneNumber });
      return `绑定成功！\n\n您的账号已与微信公众号关联，将收到以下提醒：\n• 全国群聊新消息推送\n• 新挂牌信息推送\n• 系统重要通知\n\n可随时回复"关闭通知"或"开启通知"管理推送偏好。`;
    } else {
      return `未找到手机号${phoneNumber}对应的账户\n\n请确认：\n1. 手机号是否正确\n2. 是否已在小程序中注册\n\n如有问题请联系客服。`;
    }
  } catch (error) {
    console.error('处理绑定命令失败:', error);
    return '绑定失败，请稍后重试或联系客服。';
  }
}

/**
 * 处理开启/关闭通知
 */
async function handleToggleNotification(openid, enabled) {
  try {
    const user = await prisma.users.findFirst({
      where: { wechat_official_openid: openid }
    });

    if (!user) {
      return '您还未绑定账号，请先回复"绑定 手机号"进行绑定\n\n示例：绑定 13812345678';
    }

    await prisma.users.update({
      where: { id: user.id },
      data: { wechat_notification_enabled: enabled }
    });

    console.log(`用户${user.id}${enabled ? '开启' : '关闭'}通知`);

    if (enabled) {
      return '✅ 通知已开启\n\n您将收到：\n• 全国群聊新消息推送\n• 新挂牌信息推送\n• 系统重要通知';
    } else {
      return '✅ 通知已关闭\n\n您将不会收到任何推送通知\n\n如需重新开启，请回复"开启通知"';
    }
  } catch (error) {
    console.error('处理通知开关失败:', error);
    return '操作失败，请稍后重试或联系客服。';
  }
}

/**
 * 查询绑定状态
 */
async function handleQueryStatus(openid) {
  try {
    const user = await prisma.users.findFirst({
      where: { wechat_official_openid: openid },
      select: {
        phone_number: true,
        wechat_notification_enabled: true,
        wechat_official_subscribed: true
      }
    });

    if (!user) {
      return '您还未绑定账号\n\n请回复"绑定 手机号"进行绑定\n示例：绑定 13812345678';
    }

    const notificationStatus = user.wechat_notification_enabled ? '✅ 已开启' : '❌ 已关闭';
    const phoneDisplay = user.phone_number
      ? user.phone_number.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
      : '未知';

    return `📱 绑定状态\n\n手机号：${phoneDisplay}\n通知状态：${notificationStatus}\n\n可回复"开启通知"或"关闭通知"管理推送偏好`;
  } catch (error) {
    console.error('查询绑定状态失败:', error);
    return '查询失败，请稍后重试或联系客服。';
  }
}

/**
 * 创建回复XML
 */
function createReplyXML(toUser, fromUser, content) {
  const timestamp = Math.floor(Date.now() / 1000);

  return `<xml>
<ToUserName><![CDATA[${toUser}]]></ToUserName>
<FromUserName><![CDATA[${fromUser}]]></FromUserName>
<CreateTime>${timestamp}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${content}]]></Content>
</xml>`;
}

module.exports = router;
